ScaFi Aggregate Programming Toolkit
Introduction
ScaFi (Scala Fields) is a Scala-based library and framework for Aggregate Programming. It implements a variant of the Higher-Order Field Calculus (HOFC) operational semantics, which is made available as a usable domain-specific language (DSL), and provides a platform and API for simulating and executing Aggregate Computing systems and applications.
Learning Resources
- ScaFi User Manual
- ScaFi Developer Manual
- https://github.com/scafi/hello-scafi : shows basic usage of ScaFi
- https://github.com/scafi/learning-scafi-alchemist : shows how to use ScaFi within the Alchemist simulator in order to simulate aggregate systems
- A tutorial repository on ScaFi and aggregate computing by G. Audrito
Usage
Notes
- ScaFi >= 0.3.3 cross-compiles for Scala 2.11, 2.12, 2.13.
Steps
- Add the dependency to scafi in your project, e.g., via sbt (
build.sbt
):
val scafiVersion = "1.1.5"
val scafi_core = "it.unibo.scafi" %% "scafi-core" % scafiVersion
val scafi_simulator = "it.unibo.scafi" %% "scafi-simulator" % scafiVersion
val scafi_simulator_gui = "it.unibo.scafi" %% "scafi-simulator-gui" % scafiVersion
val scafi_platform = "it.unibo.scafi" %% "scafi-distributed" % scafiVersion
libraryDependencies ++= Seq(scafi_core, scafi_simulator_gui, scafi_platform)
or via Gradle (build.gradle.kts
):
plugins {
java
scala
}
dependencies {
val scalaMajor = "2.12"
val scafiVersion = "1.1.5"
implementation("org.scala-lang:scala-library:2.12.14")
implementation("it.unibo.scafi:scafi-core_$scalaMajor:$scafiVersion")
implementation("it.unibo.scafi:scafi-simulator-gui_$scalaMajor:$scafiVersion")
}
- Use the API (e.g., to set up a simple simulation)
package experiments
import it.unibo.scafi.incarnations.BasicSimulationIncarnation.AggregateProgram
class MyAggregateProgram extends AggregateProgram {
override def main() = gradient(isSource)
def gradient(source: Boolean): Double =
rep(Double.PositiveInfinity){ distance =>
mux(source) { 0.0 } {
foldhood(Double.PositiveInfinity)(Math.min)(nbr{distance}+nbrRange)
}
}
def isSource = sense[Boolean]("sens1")
def nbrRange = nbrvar[Double](NBR_RANGE_NAME)
}
import it.unibo.scafi.simulation.frontend.{Launcher, Settings}
object SimulationRunner extends Launcher {
Settings.Sim_ProgramClass = "experiments.MyAggregateProgram"
Settings.ShowConfigPanel = false
launch()
}
More information is available in the ScaFi Documentation.
Related tools
- Alchemist Simulator: a rich, flexible simulation framework that supports ScaFi
- Protelis: an external Aggregate Programming DSL
People
Main Researchers and Authors
- Mirko Viroli
- Roberto Casadei
- Gianluca Aguzzi
Research Collaborators
- Danilo Pianini
- Giorgio Audrito
- Ferruccio Damiani
References
- See papers
Contacts
- roby [dot] casadei [at] unibo.it
- mirko [dot] viroli [at] unibo.it